const express = require('express');
const dotenv = require('dotenv');
const cors = require('cors');
const db = require('./utils/db');
const { 
  notFound, 
  errorHandler,
  validationErrorHandler,
  authErrorHandler,
  databaseErrorHandler
} = require('./middlewares/errorHandler');
const { httpLogger } = require('./utils/logger');
const userRoutes = require('./routes/userRoutes');
const documentRoutes = require('./routes/documentRoutes');
const cardRoutes = require('./routes/cardRoutes');
const exerciseRoutes = require('./routes/exerciseRoutes');
const learningPathRoutes = require('./routes/learningPathRoutes');
const testingRoutes = require('./routes/testingRoutes');
const path = require('path');
const fs = require('fs');

// 加载环境变量
const envPath = path.resolve(process.cwd(), '.env');
console.log('尝试从以下路径加载 .env 文件:', envPath);
console.log('.env 文件是否存在:', fs.existsSync(envPath));
dotenv.config({ path: envPath });

// 检查环境变量是否加载
console.log('环境变量加载状态:');
console.log('- NODE_ENV:', process.env.NODE_ENV);
console.log('- ALIBABA_QWEN_API_KEY 是否已设置:', !!process.env.ALIBABA_QWEN_API_KEY);

// 连接数据库
db.connect();

const app = express();

// 中间件
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

// 请求日志记录
app.use(httpLogger);

// 静态文件
app.use('/uploads', express.static(path.join(__dirname, '../uploads')));

// 路由
app.use('/api/users', userRoutes);
app.use('/api/documents', documentRoutes);
app.use('/api/cards', cardRoutes);
app.use('/api/exercises', exerciseRoutes);
app.use('/api/learning-paths', learningPathRoutes);

// 测试路由 (仅在非生产环境)
if (process.env.NODE_ENV !== 'production') {
  app.use('/api/testing', testingRoutes);
}

// 基本路由
app.get('/', (req, res) => {
  res.send('API 运行中...');
});

// 404处理
app.use(notFound);

// 错误处理中间件（顺序很重要）
app.use(validationErrorHandler);
app.use(authErrorHandler);
app.use(databaseErrorHandler);
app.use(errorHandler);

// 设置定时清理孤立数据的任务
const setupCleanupTasks = () => {
  // 设置每天凌晨3点运行清理任务
  const runDailyCleanup = async () => {
    console.log('开始执行每日数据清理任务...');
    
    try {
      // 清理孤立数据
      const result = await db.cleanupOrphanData();
      console.log('每日数据清理完成:', result);
    } catch (error) {
      console.error('每日数据清理失败:', error);
    }
    
    // 设置下一次运行
    scheduleNextRun();
  };
  
  const scheduleNextRun = () => {
    const now = new Date();
    const nextRun = new Date();
    
    // 设置为明天凌晨3点
    nextRun.setDate(now.getDate() + 1);
    nextRun.setHours(3, 0, 0, 0);
    
    // 计算时间差（毫秒）
    const timeUntilNextRun = nextRun - now;
    
    console.log(`下次数据清理将在 ${nextRun.toLocaleString()} 运行，还有 ${Math.floor(timeUntilNextRun / 1000 / 60 / 60)} 小时`);
    
    // 设置定时器
    setTimeout(runDailyCleanup, timeUntilNextRun);
  };
  
  // 启动定时任务
  scheduleNextRun();
};

// 只有在直接运行此文件时才启动服务器和定时任务
if (require.main === module) {
  const PORT = process.env.PORT || 5000;
  app.listen(PORT, () => {
    console.log(`服务器在 ${process.env.NODE_ENV} 模式下运行，端口: ${PORT}`);
    
    // 启动定时清理任务
    setupCleanupTasks();
  });
}

module.exports = app; 